﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Threading;


namespace WindowsFormsApplication1
{
    public partial class FormPrincipal : Form
    {
        EcgSD SD = new EcgSD();
        EcgRF RF = new EcgRF();
		EcgDetalhe Detalhe = new EcgDetalhe();
        Bdac bdac = new Bdac();
        
        private int MAX = 4917; //Representa 3V
        private delegate void PassaDados(int i);
        private int semaforo;

        public static int contTempo;    // contador de tempo seg

        public static int vezes;        // vezes que estourou o topo do buffer
        public static int topo, posicaoSelecionada, derivacaoSelecionada;         // iterações para alarme
        public static int topo2, pctboxSelectedSD;
        private PictureBox[] pictureGroupRF = new PictureBox[4];
        private int EscalaTempoRF;

        private PictureBox[] pictureGroup = new PictureBox[4];

        private int[, ,] Amostras4x3 = new int[4, 3, 16001]; //armazenamento dos dados para as pictures 4x3
        private int[, ,] AmostrasRF = new int[4, 3, 16001]; //armazenamento dos dados para as pictures 4x3
        private int tamanhoDetalhe=3*960;
        private int[] amostras4x3Detalhada = new int[3 * 960 + 1];

        private int[, ,] Amostras4x3Acel = new int[4, 3, 16001]; //armazenamento para dados dos acelerometros

        private void FormPrincipal_Load(object sender, EventArgs e)
        {
            //Inicializa TabSD
            SD.setForm(this);
            SD.inicializarTab();
            SD.plotaGrade();

            //Inicializa TabRF
            RF.setForm(this);
            RF.inicializarTab();
            RF.plotaGradeRF();

            Detalhe.setForm(this);
        }

        public int getSemaforo()
        {
            return semaforo;
        }

        public void setSemaforo(int semaforo)
        {
            this.semaforo = semaforo;
        }

        public int getMAX()
        {
            return MAX;
        }

        public FormPrincipal()
        {
            InitializeComponent();
        }


        private void CarregarNovoArq_Click(object sender, EventArgs e)
        {
            SD.carregaArquivo();
            btnDemostrarAceleracao.Enabled = true;
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            contTempo++;
        }


        private void btnReiniciarCaptura_Click(object sender, EventArgs e)
        {
            //RF.resetaPictureBoxes();
            RF.interromperCaptura();
        }

        private void Opção3seg_Click(object sender, EventArgs e)
        {
            tamanhoDetalhe = 3 * 960;
            hscrbrRF.Maximum = 6 * 960 + 240 - 1;
            if (hscrbrRF.Value >= hscrbrRF.Maximum)
                hscrbrRF.Value = 6 * 960;
            Detalhe.setTamanhoDetalhe(tamanhoDetalhe);
            Detalhe.plotaDetalhes();
        }

        private void Opção2seg_Click(object sender, EventArgs e)
        {
            tamanhoDetalhe = 2 * 960;
            hscrbrRF.Maximum = 7 * 960 + 240 - 1;
            if (hscrbrRF.Value >= hscrbrRF.Maximum)
                hscrbrRF.Value = 7 * 960;
            Detalhe.setTamanhoDetalhe(tamanhoDetalhe);
            Detalhe.plotaDetalhes();
        }

        private void Opção1seg_Click(object sender, EventArgs e)
        {
            tamanhoDetalhe = 1 * 960;
            hscrbrRF.Maximum = 8 * 960 + 240 - 1;
            if (hscrbrRF.Value >= hscrbrRF.Maximum)
                hscrbrRF.Value = 8 * 960;
            Detalhe.setTamanhoDetalhe(tamanhoDetalhe);
            Detalhe.plotaDetalhes();
        }


        private void pctbxRF1_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            RF.pictureBoxRFClick(mouseEvent, 0);
            Detalhe.setAmostrasDetalhada(RF.getAmostrasDetalhada()); 
        }

        private void rdbtnAmpliacao5_Click(object sender, EventArgs e)
        {
            SD.setGanho(0.5);
        }

        private void rdbtnAmpliacao1_Click(object sender, EventArgs e)
        {
            SD.setGanho(1);
        }

        private void rdbtnAmpliacao2_Click(object sender, EventArgs e)
        {
            SD.setGanho(2);
        }

        private void rdbtnVelocidade50mm_Click(object sender, EventArgs e)
        {
            SD.setVelocidade(3840);
        }

        private void rdbtnVelocidade25mm_Click(object sender, EventArgs e)
        {
            SD.setVelocidade(2*3840);
        }

        private void rdbtnVelocidade125mm_Click(object sender, EventArgs e)
        {
            SD.setVelocidade(4 * 3840);
        }

        private void rdbtnOpcaoMinutos_Click(object sender, EventArgs e)
        {
            SD.setAvancaRecua(0);
        }

        private void rdbtnOpcaoDezenasMin_Click(object sender, EventArgs e)
        {
            SD.setAvancaRecua(1);
        }

        private void rdbtnOpcaoHoras_Click(object sender, EventArgs e)
        {
            SD.setAvancaRecua(2);
        }

        private void rdbtnOpcaoQuadros_Click(object sender, EventArgs e)
        {
            SD.setAvancaRecua(3);
        }

        private void btnAvancar_Click(object sender, EventArgs e)
        {
            SD.avanca();
        }

        private void btnRecuar_Click(object sender, EventArgs e)
        {
            SD.recuar();
        }

        private void btnDemostrarAceleracao_Click(object sender, EventArgs e)
        {
            SD.ativarAceleracao();
        }

        private void pctbxSD1_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            SD.pictureBoxSDClick(mouseEvent, 0);
            Detalhe.setAmostrasDetalhada(SD.getAmostrasDetalhada()); 
        }

        private void pctbxSD2_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            SD.pictureBoxSDClick(mouseEvent, 1);
            Detalhe.setAmostrasDetalhada(SD.getAmostrasDetalhada()); 
        }

        private void pctbxSD3_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            SD.pictureBoxSDClick(mouseEvent, 2);
            Detalhe.setAmostrasDetalhada(SD.getAmostrasDetalhada()); 
        }

        private void pctbxSD4_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            SD.pictureBoxSDClick(mouseEvent, 3);
            Detalhe.setAmostrasDetalhada(SD.getAmostrasDetalhada()); 
        }

        private void btnFazerMedidas_Click(object sender, EventArgs e)
        {
            amostras4x3Detalhada = SD.getAmostrasDetalhada();
            Detalhe.plotaDetalhes();
            SSTab1.SelectedTab = tbpgDetalhes;
        }

        private void Corta60_Click(object sender, EventArgs e)
        {
            Detalhe.filtro60hz();
        }

        private void PB250_Click(object sender, EventArgs e)
        {
            Detalhe.filtroPassaBaixo250hz();
        }

        private void PB100_CheckedChanged(object sender, EventArgs e)
        {
            Detalhe.filtroPassaBaixo100hz();
        }

        private void rdbtnSemFiltragem_Click(object sender, EventArgs e)
        {
            Detalhe.semFiltro();
        }


        private void chkbxSinalSemFiltragem_Click(object sender, EventArgs e)
        {
            Detalhe.plotaDetalhes();
        }

        private void rdbtnPotenciaisTardios_Click(object sender, EventArgs e)
        {
            Detalhe.potenciaisTardios();
        }

        private void rdbtn12mm_Click(object sender, EventArgs e)
        {
            Detalhe.setGanhoDetalhe(2);
            Detalhe.plotaDetalhes();
        }

        private void rdbtn33mm_Click(object sender, EventArgs e)
        {
            Detalhe.setGanhoDetalhe(1);
            Detalhe.plotaDetalhes();
        }

        private void rdbtn66mm_Click(object sender, EventArgs e)
        {
            Detalhe.setGanhoDetalhe(0.5);
            Detalhe.plotaDetalhes();
        }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void pctboxDetalhada_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            Detalhe.setParametro(mouseEvent.X);
        }

        private void SairModoMarcação_Click(object sender, EventArgs e)
        {
            Detalhe.sairModoMarcacao();
        }

        private void ApagarMarcações_Click(object sender, EventArgs e)
        {
            Detalhe.limparMarcacoes();
        }

        private void pictureBox5_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros0.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pictureBox6_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros1.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pctbxParametros2_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros2.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pctbxParametros3_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros3.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pctbxParametros4_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros4.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pctbxParametros5_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros5.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pctbxParametros6_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros6.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pctbxParametros7_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros7.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void pctbxParametros8_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            pctbxParametros8.BackColor = colorDialog.Color;
            Detalhe.plotaDetalhes();
        }

        private void btIniciaCaptura_Click(object sender, EventArgs e)
        {
            RF.iniciaCaptura();
        }

        private void rdbtnAmpliacao5RF_Click(object sender, EventArgs e)
        {
            RF.setGanho(0.5);
        }

        private void rdbtnAmpliacao1RF_Click(object sender, EventArgs e)
        {
            RF.setGanho(1);
        }

        private void rdbtnAmpliacao2RF_Click(object sender, EventArgs e)
        {
            RF.setGanho(2);
        }

        private void rdbtnVelocidade50mmRF_Click(object sender, EventArgs e)
        {
            RF.setVelocidade(3840);
        }

        private void rdbtnVelocidade25mmRF_Click(object sender, EventArgs e)
        {
            RF.setVelocidade(7680);
        }

        private void rdbtnVelocidade125mmRF_Click(object sender, EventArgs e)
        {
            RF.setVelocidade(15360);
        }

        private void btnFazerMedidasRF_Click(object sender, EventArgs e)
        {
            amostras4x3Detalhada = RF.getAmostrasDetalhada();
            Detalhe.plotaDetalhes();
            SSTab1.SelectedTab = tbpgDetalhes;
        }

        private void pctbxRF2_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            RF.pictureBoxRFClick(mouseEvent, 1);
            Detalhe.setAmostrasDetalhada(RF.getAmostrasDetalhada()); 
        }

        private void pctbxRF3_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            RF.pictureBoxRFClick(mouseEvent, 2);
            Detalhe.setAmostrasDetalhada(RF.getAmostrasDetalhada()); 
        }

        private void pctbxRF4_Click(object sender, EventArgs e)
        {
            MouseEventArgs mouseEvent = (MouseEventArgs)e;
            RF.pictureBoxRFClick(mouseEvent, 3);
            Detalhe.setAmostrasDetalhada(RF.getAmostrasDetalhada()); 
        }

        private void FormPrincipal_LocationChanged(object sender, EventArgs e)
        {
            RF.rePloteRF();
        }

        private void SSTab1_Selected(object sender, TabControlEventArgs e)
        {
            RF.rePloteRF();
        }

        private void btnSalvarArquivo_Click(object sender, EventArgs e)
        {
            RF.salvarArquivo();
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            SD.reset();
        }

        private void hscrbrRF_Scroll(object sender, ScrollEventArgs e)
        {
            Detalhe.scroll();
        }

        private void btnCalcularParametros_Click(object sender, EventArgs e)
        {
            Detalhe.calcularParametro();
        }

        private void FormPrincipal_RegionChanged(object sender, EventArgs e)
        {
            RF.rePloteRF();
        }

        private void analiseHolter_Click(object sender, EventArgs e)
        {
         //   testLabel.Text = "Olha o tanto de setores: "+SD.getNumeroDeBlocos();
        }

        private void analiseBtn_Click(object sender, EventArgs e)
        {
         /*   for(int i=0; i<20; i++)
            {
                for (int j = 0; j < 200; j++)
                {
                        labelDados.Text = labelDados.Text + " " + SD.getAmostrasSD(0,20*i+j).ToString();
                }
            labelDados.Text = labelDados.Text + "\n";
            }*/
            int sampleCount = 0;
			bdac.ResetBDAC();
			int j=0;
			int[] dTime = new int[50];
           for (int i = 0; i < 60000; i++)
            {
                // If a beat was detected, annotate the beat location
                // and type.
				++sampleCount;
                int delay = bdac.BeatDetect(SD.getAmostrasSD(0,i),i);
                Console.Write("+ " + sampleCount.ToString() +"///"+SD.getAmostrasSD(0,i)+ "\n");
				
                if (delay!= 0)
                {
                    int DetectionTime = sampleCount - delay;
					dTime[j] = DetectionTime;
                    j++;
                    // Convert sample count to input file sample
                    // rate.

                    //DetectionTime *= InputFileSampleFrequency;
                    //DetectionTime /= sampleRate;
                    Console.Write(j.ToString()+"-------------- " + DetectionTime.ToString() + "\n");
                } 
            }
			for(j=0;j<40;j++)
			 Console.Write("\nloL "+j.ToString()+") "+dTime[j]);

        }






    }

}
